﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TD.bom
{
    /// <summary>
    /// Classe de base à tous les objets d'une carte
    /// </summary>
    public class MapObject
    {
        /// <summary>
        /// Etat initial commun à tous les objets
        /// </summary>
        public const int InitialState = 0;

        /// <summary>
        /// Nom du template à partir duquel cet objet a été créé
        /// </summary>
        public string TemplateName { get; protected set; }

        /// <summary>
        /// Template à partir duquel cet objet a été créé
        /// </summary>
        public TemplateBase Template { get; protected set; }

        /// <summary>
        /// Carte à laquelle l'objet appartient
        /// </summary>
        public Map Map { get; set; }

        protected List<Effect> m_effects;

        /// <summary>
        /// Effets s'appliquant à l'objet
        /// </summary>
        public List<Effect> Effects
        {
            get
            {
                if (m_effects == null)
                {
                    m_effects = new List<Effect>();
                }

                return m_effects;
            }
        }

        /// <summary>
        /// Case éventuelle sur laquelle se trouve l'objet
        /// </summary>
        public Case Case { get; set; }

        /// <summary>
        /// Position sur la carte
        /// </summary>
        public MapObjectPosition Position { get; set; }

        /// <summary>
        /// Taille sur la carte
        /// </summary>
        public MapObjectSize Size { get; set; }

        /// <summary>
        /// Etat de l'objet
        /// </summary>
        public int State { get; set; }

        /// <summary>
        /// Objet à usage du renderer
        /// </summary>
        public object RendererData { get; set; }

        /// <summary>
        /// Construit un MapObjecton lui indiquant sa carte
        /// </summary>
        /// <param name="p_map">Carte à laquelle il appartient</param>
        public MapObject(Map p_map, string p_templateName)
        {
            // Intégrité des paramètres
            if (string.IsNullOrEmpty(p_templateName))
            {
                throw new ArgumentNullException("p_templateName", "Le nom de la case est nécessaire");
            }

            if (p_map == null)
            {
                throw new ArgumentNullException("p_map", "Un MapObject ne peut pas être construit sans carte");
            }

            // Initialisations 
            Map = p_map;
            TemplateName = p_templateName;
            State = InitialState;
            Position = new MapObjectPosition();
            Size = new MapObjectSize();
        }
    }
}
